27. 考虑错误

🚧 三种错误

根据我的经验,编程中会出现三大类型的错误: 语法错误 用法错误 逻辑错误

语法错误就像拼写错误

第一个是 语法错误 。也就是写的代码在语言语法上不合理。在 Python 中,如果只写了 ) ,但是前面没有 ( ,则存在语法错误。如果 for 循环里忘了 : ,则也存在语法错误。

import turtle
alison = turtle.Turtle()
for angle in [15, 30, 45]     # missing colon  缺少冒号
    alison.right 90)          # missing parenthesis  缺少括号

语法错误就像拼写错误。当你学习新的语言时,很可能会犯很多语法错误。但是当你熟练该语言后,错误就会少了。

用法错误就像不合理的答案

第二种错误可以称之为 用法错误 。当你要求计算机执行不合理的操作时,就存在用法错误。例如, alison.forward("orange") 是用法错误。完全符合语法,但是 forward 方法要求提供数字(表示像素距离),而不是字符串。turtle 无法向前移动 "orange" 像素。

这种错误就相当于说的话很奇怪,或者答案不合理:

问: 今天午餐你要吃什么?

答: 从纽约到伦敦的距离。

问: 你最喜欢的颜色是什么颜色?

答: 企鹅。

你不能吃距离;企鹅不是颜色。对于这些问题来说,这些答案不合理,就像 "orange" 不能作为 forward 方法的输入一样。

Python 的 NameError TypeError 消息通常都是这种类型的错误。你之前见到的 ZeroDivisionError 也算是这种错误。

逻辑错误就像提出错误的要求

最后,第三种错误是 逻辑错误 。程序能正常运行 — 没有崩溃 — 但是行为和你想要的不一样,因为你所写的和你想要的不一样。这就和人们常常说道“计算机并非按照你所想的去操作,而是按照你告诉它的指令去操作。”一个意思。

例如,如果我想画一个八边形 🛑,并且我的代码是 —

import turtle
michael = turtle.Turtle()
for side in [1, 2, 3, 4, 5, 7, 8]:
    michael.forward(100)
    michael.right(45)

那么我的代码存在逻辑错误。请仔细检查,看看你能否找到该错误。

在没有运行上述 michael 代码的情况下,你认为哪行有错误?

SOLUTION: **for** 循环开始的行

缩进可能很麻烦

代码可能会出错的地方是循环缩进。如果你发现某些代码行运行的次数超出(或少于)预期了,仔细检查下循环缩进情况。

for a in [1, 2, 3]:
    # code here will run 3 times.  此处代码将运行 3 次
    for b in [4, 5, 6]:
        # code in here will run 9 times  此处代码将运行 9 次
    # but code here will run only 3 times!  但此处代码将只运行 3 次

当以下代码运行时, willow 将总共向前移动多少距离?

willow = turtle.Turtle()
for x in [1, 2, 3]:
    willow.forward(1)
    for y in [4, 5, 6, 7]:
        willow.forward(1)
    willow.forward(1)
SOLUTION: 18 个像素